package com.c2b.algorithm.leetcode.base;

/**
 * <a href='https://leetcode.cn/problems/longest-even-odd-subarray-with-threshold/'>最长奇偶子数组(Longest Even Odd Subarray With Threshold)</a>
 * <p>给你一个下标从 0 开始的整数数组 nums 和一个整数 threshold 。</p>
 * <p>
 * 请你从 nums 的子数组中找出以下标 l 开头、下标 r 结尾 (0 <= l <= r < nums.length) 且满足以下条件的 最长子数组 ：
 *     <ul>
 *         <li>nums[l] % 2 == 0</li>
 *         <li>对于范围 [l, r - 1] 内的所有下标 i ，nums[i] % 2 != nums[i + 1] % 2</li>
 *         <li>对于范围 [l, r] 内的所有下标 i ，nums[i] <= threshold</li>
 *     </ul>
 *     以整数形式返回满足题目要求的最长子数组的长度。
 * </p>
 * <p>注意：子数组 是数组中的一个连续非空元素序列。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：nums = [3,2,5,4], threshold = 5
 *      输出：3
 *      解释：在这个示例中，我们选择从 l = 1 开始、到 r = 3 结束的子数组 => [2,5,4] ，满足上述条件。
 *      因此，答案就是这个子数组的长度 3 。可以证明 3 是满足题目要求的最大长度。
 *
 * 示例 2：
 *      输入：nums = [1,2], threshold = 2
 *      输出：1
 *      解释：
 *      在这个示例中，我们选择从 l = 1 开始、到 r = 1 结束的子数组 => [2] 。
 *      该子数组满足上述全部条件。可以证明 1 是满足题目要求的最大长度。
 *
 * 示例 3：
 *      输入：nums = [2,3,4,5], threshold = 4
 *      输出：3
 *      解释：
 *      在这个示例中，我们选择从 l = 0 开始、到 r = 2 结束的子数组 => [2,3,4] 。
 *      该子数组满足上述全部条件。
 *      因此，答案就是这个子数组的长度 3 。可以证明 3 是满足题目要求的最大长度。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>1 <= nums.length <= 100 </li>
 *     <li>1 <= nums[i] <= 100 </li>
 *     <li>1 <= threshold <= 100</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2023/11/16 10:05
 */
public class LC2760LongestEvenOddSubarrayWithThreshold_S {

    static class Solution {
        public int longestAlternatingSubarray(int[] nums, int threshold) {
            int left = 0;
            int ans = 0;
            while (left < nums.length) {
                // 如果遇到 奇数； 或者 大于 threshold的数，直接跳过
                if ((nums[left] % 2 != 0 || nums[left] > threshold)) {
                    left++;
                } else {
                    // 让 left 位置的数为偶数
                    int right = left + 1;
                    // 向右扩大右边界
                    while (right < nums.length && nums[right] <= threshold && nums[right] % 2 != nums[right - 1] % 2) {
                        right++;
                    }
                    ans = Math.max(ans, right - left);
                    left = right;
                }
            }
            return ans;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.longestAlternatingSubarray(new int[]{3, 2, 5, 4}, 5));
        System.out.println(solution.longestAlternatingSubarray(new int[]{1, 2}, 2));
        System.out.println(solution.longestAlternatingSubarray(new int[]{2, 3, 4, 5}, 4));
        System.out.println(solution.longestAlternatingSubarray(new int[]{4}, 1));
    }
}
